#pragma once

#include "Common.hpp"
#include "Protocol.hpp"

class Calculate
{
public:
    Calculate(){}

    // 进行计算：来一个请求结构体，返回一个答案结构体
    Response Execute(const Request& req)
    {
        int x = req.X(), y = req.Y();
        char operation = req.Oper();
        Response resp;
        unordered_map<char, function<int(int,int)>> mp = {
            { '+', [](int x, int y)->int{ return x + y; } }, 
            { '-', [](int x, int y)->int{ return x - y; } },
            { '*', [](int x, int y)->int{ return x * y; } },
            { '/', [](int x, int y)->int{ if(y == 0) return -1;return x / y; } },
            { '%', [](int x, int y)->int{ if(y == 0) return -1;return x % y; } },
        };
        if(!mp.contains(operation)) resp.SetCode(2);  // 错误码2表示没有这个操作符
        else
        {
            int ret = mp[operation](x, y);
            if(ret == -1) resp.SetCode(1);  // 错误码1就是除0错误
            else resp.SetResult(ret);
        }
        return resp; 
    }

    ~Calculate(){}
private:
}cal;

string HandlerRequest(string& inbuffer)
{
    string req_str;
    string result_str;
    while(Decode(inbuffer, &req_str))  // 只要是成功的，就一直取报文，而且保证只取完整的报文
    {
        std::string resp_str;
        // 一定拿到了一个完整的报文
        // 1. 反序列化
        if(req_str.empty())
            break;
        Request req;
        if(!req.deserialization(req_str))
        {
            // 反序列化失败
            break;
        }
        std::cout << "#################" << std::endl;
        req.Print();
        std::cout << "#################" << std::endl;
        // 2. 业务处理（+ - * /）构建应答
        Response resp = cal.Execute(req);
        // 3. 序列化
        resp.Serialization(resp_str); 
        // 4. 添加长度说明----协议
        Encode(resp_str);
        // 5. 添加所有的应答
        result_str += resp_str;
    }
    return result_str;
}